/*
 * poligono_regular.c
 *
 *  Created on: Nov 2, 2012
 *      Author: Carlos Alegría Galicia
 */

#include <stdlib.h>
#include <math.h>
#include "poligono_regular.h"
#include "punto.h"

// Implementación de la función pr_crear_poligono
//
poligono_regular *
pr_crear_poligono(punto *posicion, int lados, float radio)
{
  // verificamos que posicion no sea un apuntador nulo
  //
  if (!posicion)
    {
      return NULL ;
    }

  // un polígono regular tienen al menos 3 lados
  //
  if (lados < 3)
    {
      return NULL ;
    }

  // el radio del polígono no puede ser menor que cero
  //
  if (radio <= 0)
    {
      return NULL ;
    }

  // calculamos el perímetro y el área de acuerdo con las fórmulas especificadas
  // en la solución escrita del ejercicio
  //
  float perimetro = 2 * radio * lados * sin(M_PI / lados);
  float area = 0.5 * radio * radio * lados * sin(2 * M_PI / lados);

  // reservamos memoria para el apuntador al nuevo poligono_regular
  //
  poligono_regular *p = malloc(sizeof(poligono_regular));

  // mediante esta sintáxis creamos una nueva estructura poligono_regular
  // con sus miembros inicializados con los valores especificados. el cast es
  // necesario para poder asignar la estructura inicializada al contenido de una
  // región de memoria previamente reservada.
  //
  // si p no fuera un apuntador, la estructura podría ser inicializada como
  // sigue:
  //
  //     poligono_regular p = { posicion, lados, radio, perimetro, area };
  //
  *p = (poligono_regular) { posicion, lados, radio, perimetro, area };

  return p;
}

// Implementación de la función pr_obtener_posicion
//
punto *
pr_obtener_posicion(poligono_regular *poligono)
{
  if (!poligono)
    {
      return NULL;
    }

  return poligono->posicion;
}

// Implementación de la función pr_cambiar_posicion
//
void
pr_cambiar_posicion(poligono_regular *poligono, punto *posicion)
{
  if (!poligono || !posicion)
    {
      return;
    }

  //
  //
  poligono->posicion->x = posicion->x;
  poligono->posicion->y = posicion->y;
}
